import { MESSAGE_TYPE, MESSAGE_STATUS, CONTACT_TYPE } from "./constant";
import { isPlainObject } from "./validate";

const constraintContactBasic = data =>
    constraintObject(data, {
        id: true,
        displayName: true,
        avatar: true,
        type: {
            required: true,
            has: CONTACT_TYPE
        }
    });
const constraintMessageBasic = data =>
    constraintObject(data, {
        content: true,
        sendTime: true,
        type: {
            required: true,
            has: MESSAGE_TYPE
        }
    });

constraintContact({
    id: "123",
    displayName: "123asd",
    avatar: "123",
    type: "single",
    unread: 0,
    lastSendTime: "",
    subText: "12312312"
});

constraintMessage({
    id: "123",
    status: "succeed",
    type: "image",
    sendTime: 12312312312,
    content: "asdas",
    fromContactId: "123",
    fromUser: { id: "123", displayName: "123", avatar: "123", type: "single" }
});
export function constraintObject(data, options) {
    if (!data || !isPlainObject(data)) {
        console.error("argument must be an object");
    }
    Object.keys(options).forEach(k => {
        const option = options[k];
        const val = data[k];
        if ((option === true || option.required === true) && val === undefined) {
            console.error(`"${k}" cannot be "${val}" `);
        } else if (option.has && !option.has.includes(val)) {
            console.error(
                `"${k}" cannot be "${val}",can only be the following data "${
          option.has
        }"`
            );
        }
    });
    return true;
}

// export function constraintRecentContact(data) {
//   constraintContact(data);
//   constraintMessageBasic(data.message);
//   constraintObject(data, {
//     unread: true
//   });
// }
export function constraintContact(data) {
    constraintContactBasic(data);
    // constraintObject(data, {
    //   unread: true,
    //   lastSendTime: true,
    //   lastContent: true
    // });
}
export function constraintMessage(data) {
    constraintObject(data, {
        status: {
            required: true,
            has: MESSAGE_STATUS
        },
        fromContactId: true
    });
    constraintMessageBasic(data);
    constraintContactBasic(data.fromUser);
    let options = {};
    switch (data.type) {
        case "file":
            options = {
                fileSize: true,
                fileName: true
            };
            break;
        case "text":
            options = {
                text: true
            };
            break;
    }
    constraintObject(data, options);
}